<?php

namespace app\admin\controller\sum\user;

use addons\sum\library\Export;
use app\common\controller\Backend;
use think\Db;
use app\admin\model\sum\user\Oauth;
use Exception;
use addons\sum\exception\Exception as SumException;
use think\exception\PDOException;
use app\admin\model\sum\user\WalletLog;


/**
 * 会员管理
 *
 * @icon fa fa-user
 */
class User extends Backend
{

    protected $relationSearch = true;

    /**
     * @var \app\admin\model\user\User
     */
    protected $model = null;

    public function _initialize()
    {
        parent::_initialize();
        $this->model = new \app\admin\model\sum\user\User;
    }

    /**
     * 查看
     */
    public function index()
    {
        //设置过滤方法
        $this->request->filter(['strip_tags']);
        if ($this->request->isAjax()) {
            //如果发送的来源是Selectpage，则转发到Selectpage
            if ($this->request->request('keyField')) {
                return $this->selectpage();
            }
            $searchWhere = $this->request->request('searchWhere');
            $filter_json = $this->request->request('filter');
            $filter_arr=json_decode($filter_json,true);

            $dmap=[];
            $dfilter_json = $this->request->request('dfilter');
            $dfilter_arr=json_decode($dfilter_json,true);
            if(!empty($dfilter_arr)){
                $key = key($dfilter_arr);
                $val=$dfilter_arr[$key];
                $duser=$this->model->where($key,$val)->find();
                if($duser){
                    $dmap['did']=$duser['id'];
                }else{
                    $dmap['did']=-1;
                }
            }



            list($where, $sort, $order, $offset, $limit) = $this->buildparams();

            $subsql = \app\admin\model\oil\order\Order::where('status', 2);
            if(isset($filter_arr['createtime'])){
                $order_time_arr=explode('/',$filter_arr['createtime']);
                $subsql=$subsql->whereTime('createtime',$order_time_arr);
                //有筛选才有排序
                $sort='total_fee';
                $order='DESC';
            }
            $subsql = $subsql->field('sum(total_fee) as total_fee, user_id as order_user_id')->group('user_id')->buildSql();
            $userTableName=$this->model->getQuery()->getTable();

            $qc=$this->model
                ->join([$subsql => 'w'], $userTableName . '.id = w.order_user_id','left')
                ->where($where);
            if(!empty($dfilter_arr)){
                $qc=$qc->where($dmap);
            }else{
                $qc=$qc->whereOr('user.id', '=', $searchWhere)
                    ->whereOr('nickname', 'like', "%$searchWhere%")
                    ->whereOr('mobile', 'like', "%$searchWhere%")
                    ->whereOr('oil_num', 'like', "%$searchWhere%");
            }
            $total=$qc->order($sort, $order)
                ->count();

            $qs=$this->model
                ->join([$subsql => 'w'], $userTableName . '.id = w.order_user_id','left')
                ->where($where);
            if(!empty($dfilter_arr)){
                $qs=$qs->where($dmap);
            }else{
                $qs=$qs->whereOr('user.id', '=', $searchWhere)
                    ->whereOr('nickname', 'like', "%$searchWhere%")
                    ->whereOr('mobile', 'like', "%$searchWhere%")
                    ->whereOr('oil_num', 'like', "%$searchWhere%");
            }
            $list=$qs->order($sort, $order)
                ->limit($offset, $limit)
                ->select();
//            $total = $this->model
//                ->join([$subsql => 'w'], $userTableName . '.id = w.order_user_id','left')
////                ->with(['group'])
//                ->where($dmap)
//                ->where($where)
//                ->whereOr('user.id', '=', $searchWhere)
//                ->whereOr('nickname', 'like', "%$searchWhere%")
//                ->whereOr('mobile', 'like', "%$searchWhere%")
//                ->whereOr('oil_num', 'like', "%$searchWhere%")
//                ->order($sort, $order)
//                ->count();

//            $list = $this->model
//                ->join([$subsql => 'w'], $userTableName . '.id = w.order_user_id','left')
////                ->with(['group'])
//                ->where($dmap)
//                ->where($where)
//                ->whereOr('user.id', '=', $searchWhere)
//                ->whereOr('nickname', 'like', "%$searchWhere%")
//                ->whereOr('mobile', 'like', "%$searchWhere%")
//                ->whereOr('oil_num', 'like', "%$searchWhere%")
//                ->order($sort, $order)
////                ->order('total_fee','DESC')
//                ->limit($offset, $limit)
//                ->select();
            foreach ($list as $k => $v) {
                $v->hidden(['password', 'salt']);
                $v->third_platform = Oauth::all(['user_id' => $v->id]);
                //邀请总人数：
                //增加字段：邀请剩余人数
                //（邀请人油桶号）
                $v->children_count=Db::name('user')->where('pid',$v->id)->count();
//                $v->children_count_use=Db::name('user')->where('pid',$v->id)->where('is_used',0)->count();
                $v->parent_oil_num=Db::name('user')->where('id',$v->pid)->value('oil_num');
            }
            $result = array("total" => $total, "rows" => $list);

            $this->success('查看用户', null, $result);
        }
        return $this->view->fetch();
    }

    /**
     * 用户详情
     */
    public function profile($id)
    {
        $row = $this->model->get($id);
        if (!$row) {
            $this->error('未找到用户');
        }
        $row->hidden(['password', 'salt']);
        $row->third_platform = Oauth::all(['user_id' => $row->id]);
        if (checkEnv('commission', false)) {
            $row->parent_user = $this->model->get($row->parent_user_id);
        }
        if ($this->request->isAjax()) {
            $this->success('用户详情', null, $row);
        }
        $this->assignconfig('row', $row);
        $this->assignconfig('groupList', \app\admin\model\UserGroup::field('id,name,status')->select());
        $this->assignconfig('storeList', \app\admin\model\oil\Store::field('id,name,status')->select());
        return $this->view->fetch();
    }

    /**
     * 更新信息
     */
    public function update()
    {
        $params = $this->request->post('data');
        $params = json_decode($params, true);
        $user = $this->model->get($params['id']);
        if (!$user) {
            $this->error('未找到用户');
        }
        $result = Db::transaction(function () use ($user, $params) {

            try {
                if (!empty($params['password'])) {
                    $salt = \fast\Random::alnum();
                    $user->password = \app\common\library\Auth::instance()->getEncryptPassword($params['password'], $salt);
                    $user->salt = $salt;
                    $user->save();
                }
                $verification = $user->verification;
                if (!empty($params['mobile'])) {
                    $verification->mobile = 1;
                } else {
                    $verification->mobile = 0;
                }
                $user->verification = $verification;
                $user->save();

                return $user->validate('\app\admin\validate\sum\user\User.update')->allowField('nickname,avatar,username,group_id,birthday,bio,mobile,email,level,gender,status,self_times,store_id')->save($params);
            } catch (\Exception $e) {
                $this->error($e->getMessage());
            }
        });

        if ($result) {
            return $this->success('更新成功', null, $user);
        } else {
            return $this->error($user->getError());
        }
    }


    /**
     * 设为团队长
     */
    public function setTeamLeader($id = "")
    {
        if(!$id){
            $this->error('用户参数错误');
        }
        $user = $this->model->get($id);
        if (!$user) {
            $this->error('未找到用户');
        }
        if($user['is_team_leader']==1){
            $this->error('该用户已是团队长');
        }
        $result = Db::transaction(function () use ($user) {
            try {
                $user->is_team_leader = 1;//设置为团队长
                $user->pid = 0;//断链
                $user->did = $user->id;//团队id为自己的id
                $user->save();
                // 递归处理团队团队id
                $this->handleTeam($user['id'],$user['id']);
                return true;
            } catch (\Exception $e) {
                $this->error($e->getMessage());
            }
        });
        if ($result) {
            return $this->success('设置成功', null, $user);
        } else {
            return $this->error($user->getError());
        }
    }
    //处理团队id
    public function handleTeam($ids,$did){
        $this->model->where('id','in',$ids)->update(['did'=>$did]);
        $child_ids=$this->model->where('pid','in',$ids)->column('id');
        if($child_ids){
            $this->handleTeam($child_ids,$did);
        }
    }
    /**
     * 选择
     */
    public function select()
    {
        //设置过滤方法
        $this->request->filter(['strip_tags']);
        if ($this->request->isAjax()) {
            //如果发送的来源是Selectpage，则转发到Selectpage
            if ($this->request->request('keyField')) {
                return $this->selectpage();
            }
            list($where, $sort, $order, $offset, $limit) = $this->buildparams();
            $searchWhere = $this->request->request('search');
            $total = $this->model
                ->where($where)
                ->whereOr('id', '=', $searchWhere)
                ->whereOr('nickname', 'like', "%$searchWhere%")
                ->whereOr('mobile', 'like', "%$searchWhere%")
                ->order($sort, $order)
                ->field('id, nickname, mobile, avatar')
                ->count();
            $list = $this->model
                ->where($where)
                ->whereOr('id', '=', $searchWhere)
                ->whereOr('nickname', 'like', "%$searchWhere%")
                ->whereOr('mobile', 'like', "%$searchWhere%")
                ->order($sort, $order)
                ->field('id, nickname, mobile, avatar')
                ->limit($offset, $limit)
                ->select();
            $result = array("total" => $total, "rows" => $list);

            $this->success('选择用户', null, $result);
        }
        return $this->view->fetch();
    }

    /**
     * 用户余额充值
     */
    public function money_recharge()
    {

        if ($this->request->isAjax()) {
            $params = $this->request->post();
            $user = $this->model->get($params['user_id']);
            $params['money'] = $params['money'];
            if ($params['money'] > 0) {
                $type = 'admin_recharge';
            } elseif ($params['money'] < 0) {
                $type = 'admin_deduct';
            } else {
                $this->error('请输入正确的金额');
            }
            $result = Db::transaction(function () use ($params, $user, $type) {
                return \addons\sum\model\User::money($params['money'], $user->id, $type, 0, $params['remarks']);
            });
            if ($result) {
                $this->success('操作成功');
            } else {
                $this->error('操作失败');
            }
        }
        return $this->view->fetch();
    }

    /**
     * 用户积分充值
     */
    public function score_recharge()
    {
        if ($this->request->isAjax()) {
            $params = $this->request->post();
            $user = $this->model->get($params['user_id']);
            $params['score'] = intval($params['score']);
            if ($params['score'] > 0) {
                $type = 'admin_recharge';
            } elseif ($params['score'] < 0) {
                $type = 'admin_deduct';
            } else {
                $this->error('请输入正确的数量');
            }
            $result = Db::transaction(function () use ($params, $user, $type) {
                try {
                    return \addons\sum\model\User::score($params['score'], $user->id, $type, 0, $params['remarks']);
                } catch (\Exception $e) {
                    $this->error($e->getMessage());
                }
            });
            if ($result) {
                $this->success('操作成功');
            } else {
                $this->error('操作失败');
            }
        }
        return $this->view->fetch();
    }

    /**
     * 用户佣金充值
     */
    public function commission_recharge()
    {

        if ($this->request->isAjax()) {
            $params = $this->request->post();
            $user = $this->model->get($params['user_id']);
            $params['commission'] = $params['commission'];
            if ($params['commission'] > 0) {
                $type = 'admin_recharge';
            } elseif ($params['commission'] < 0) {
                $type = 'admin_deduct';
            } else {
                $this->error('请输入正确的金额');
            }
            $result = Db::transaction(function () use ($params, $user, $type) {
                return \addons\sum\model\User::commission($params['commission'], $user->id, $type, 0, $params['remarks']);
            });
            if ($result) {
                $this->success('操作成功');
            } else {
                $this->error('操作失败');
            }
        }
        return $this->view->fetch();
    }


    /**
     * 余额明细
     */
    public function money_log($user_id, $limit = 10)
    {
        if ($this->request->isAjax()) {
            $model = new WalletLog();
            $data = $model->where(['user_id' => $user_id, 'wallet_type' => 'money'])->order('id desc')->paginate($limit);
            $this->success('余额明细', null, $data);
        }
    }

    /**
     * 积分明细
     */
    public function score_log($user_id, $limit = 10)
    {
        if ($this->request->isAjax()) {
            $model = new WalletLog();
            $data = $model->where(['user_id' => $user_id, 'wallet_type' => 'score'])->order('id desc')->paginate($limit);
            $this->success('积分明细', null, $data);
        }
    }

    /**
     * 佣金明细
     */
    public function commission_log($user_id, $limit = 10)
    {
        if ($this->request->isAjax()) {
            $model = new WalletLog();
            $data = $model->where(['user_id' => $user_id, 'wallet_type' => 'commission'])->order('id desc')->paginate($limit);
            $this->success('佣金明细', null, $data);
        }
    }

    /**
     * 订单记录
     */
    public function order_log($user_id, $limit = 10)
    {
        if ($this->request->isAjax()) {
            $this->loadlang('sum/order/order');
            $model = new \app\admin\model\sum\order\Order;
            $data = $model->where('user_id', $user_id)->order('id desc')->paginate($limit);
            $this->success('订单记录', null, $data);
        }
    }

    /**
     * 登录记录
     */
    public function login_log($user_id, $limit = 10)
    {
        if ($this->request->isAjax()) {
        }
    }

    /**
     * 分享记录
     */
    public function share_log($user_id, $limit = 10)
    {
        if ($this->request->isAjax()) {
            $this->loadlang('sum/share');
            $model = new \app\admin\model\sum\Share;
            $data = $model->where('share_id', $user_id)->order('id desc')->with([
                'user' => function ($query) {
                    return $query->withField('id,nickname,avatar');
                }
            ])->paginate($limit);
            foreach ($data as &$v) {
                if ($v['type'] === 'goods') {
                    $v['goods'] = \app\admin\model\sum\goods\Goods::where('id', $v['type_id'])->field('id, image, title')->find();
                }
                if ($v['type'] === 'groupon') {
                    $v['groupon'] = \app\admin\model\sum\activity\Groupon::get($v['type_id']);
                }
            }
            $this->success('分享记录', null, $data);
        }
    }

    /**
     * 收藏商品
     */
    public function goods_favorite($user_id, $limit = 10)
    {
        if ($this->request->isAjax()) {

            $model = new \app\admin\model\sum\user\Favorite;
            $data = $model->where('user_id', $user_id)->order('id desc')->with([
                'goods' => function ($query) {
                    return $query->withField('id,title,image');
                }
            ])->paginate($limit);
            $this->success('商品收藏', null, $data);
        }
    }

    /**
     * 浏览足迹
     */
    public function goods_view($user_id, $limit = 10)
    {
        if ($this->request->isAjax()) {

            $model = new \app\admin\model\sum\user\View;
            $data = $model->where('user_id', $user_id)->order('id desc')->with([
                'goods' => function ($query) {
                    return $query->withField('id,title,image');
                }
            ])->paginate($limit);
            $this->success('商品收藏', null, $data);
        }
    }

    /**
     * 优惠券
     */
    public function coupon_log($user_id, $limit = 10)
    {
        if ($this->request->isAjax()) {
            $model = new \app\admin\model\sum\user\Coupon;
            $data = $model->where('user_id', $user_id)->order('id desc')->with(['coupons' => function ($query) {
                return $query->withField('id,name,amount');
            }])->paginate($limit);
            $this->success('优惠券', null, $data);
        }
    }


    /**
     * 删除
     */
    public function del($ids = "")
    {
        if (!$this->request->isPost()) {
            $this->error(__("Invalid parameters"));
        }
        $ids = $ids ? $ids : $this->request->post("ids");
        if ($ids) {
            $pk = $this->model->getPk();
            $list = $this->model->where($pk, 'in', $ids)->select();

            $count = 0;
            Db::startTrans();
            try {
                foreach ($list as $k => $v) {
                    // 删除这个用户关联的 sum_user_oauth 记录
                    Oauth::where('user_id', $v->id)->delete();

                    // 删除用户
                    $count += $v->delete();
                }
                Db::commit();
            } catch (PDOException $e) {
                Db::rollback();
                $this->error($e->getMessage());
            } catch (Exception $e) {
                Db::rollback();
                $this->error($e->getMessage());
            }
            if ($count) {
                $this->success();
            } else {
                $this->error(__('No rows were deleted'));
            }
        }
        $this->error(__('Parameter %s can not be empty', 'ids'));
    }

    /**
     * 更换上级推荐人
     */
    public function changeParentUser($id)
    {
        $user = $this->model->get($id);
        $value = $this->request->post('value');

        if (!$user) {
            $this->error('未找到用户');
        }
        $agent = new \addons\sum\library\commission\Agent($id);
        if ($agent->agent) {
            $this->error('请前往分销中心操作该用户');
        }
        try {
            if ($user->parent_user_id == $value) {
                throw \Exception('请勿重复选择');
            }
            if ($user->id == $value) {
                throw \Exception('不能绑定本人');
            }
            if ($value != 0) {
                $parentAgent = new \addons\sum\library\commission\Agent($value);
                if (!$parentAgent || !$parentAgent->agent) {
                    throw \Exception('未找到该分销商');
                }
            }
            if (!$this->checkChangeParentAgent($user->id, $value)) {
                throw \Exception('不能绑定该分销商');
            }
            $runUpgradeLastAgentId = $user->parent_user_id;
            $user->parent_user_id = $value;
            $user->save();
            if (!empty($runUpgradeLastAgentId)) {
                $agent->asyncAgentUpgrade($runUpgradeLastAgentId);
            }
            if (!empty($user->parent_user_id)) {
                $agent->asyncAgentUpgrade($user->parent_user_id);
            }
        } catch (\Exception $e) {
            $this->error($e->getMessage());
        }

        $this->success('绑定成功');
    }

    // 递归往上找推荐人，防止出现推荐闭环
    private function checkChangeParentAgent($userId, $parentAgentId)
    {
        if ($userId === $parentAgentId) {
            return false;
        }
        if ($parentAgentId == 0) {
            return true;
        }

        $parentAgent = \app\admin\model\sum\commission\Agent::get($parentAgentId);
        if ($parentAgent) {
            if ($parentAgent->parent_agent_id === 0) {
                return true;
            } else {
                return $this->checkChangeParentAgent($userId, $parentAgent->parent_agent_id);
            }
        }

        return false;
    }

    // 增加设置立减机会
    public function set_self_times()
    {
        $params = $this->request->post();
        $type=$params['type'];
        if($type=='set'){
            $this->model->where('id','in',$params['ids'])->update([
                'self_times'=>$params['num']
            ]);
        }else{
            $this->model->where('id','in',$params['ids'])->setInc('self_times',$params['num']);
        }

        $this->success('更新成功');
    }

    /**
     * 订单导出
     */
    public function export()
    {
        $expCellName = [
            'id' => 'ID',
            'oil_num' => '油桶号',
            'avatar' => '头像',
            'username' => '用户名',
            'nickname' => '昵称',
            'mobile' => '手机号',
            'children_count' => '邀请总人数',
            'did' => '团队ID',
            'litre' => '加油升数',
            'total_fee' => '消费金额(下单时间内)',
            'parent_oil_num' => '邀请人油桶号',
            'logintime_text' => '加入时间',

        ];
        $export = new Export();
        $spreadsheet = null;
        $sheet = null;

        $searchWhere = $this->request->request('searchWhere');
        $filter_json = $this->request->request('filter');
        $filter_arr=json_decode($filter_json,true);

        $dmap=[];
        $dfilter_json = $this->request->request('dfilter');
        $dfilter_arr=json_decode($dfilter_json,true);
        if(!empty($dfilter_arr)){
            $key = key($dfilter_arr);
            $val=$dfilter_arr[$key];
            $duser=$this->model->where($key,$val)->find();
            if($duser){
                $dmap['did']=$duser['id'];
            }else{
                $dmap['did']=-1;
            }
        }



        list($where, $sort, $order, $offset, $limit) = $this->buildparams();

        $subsql = \app\admin\model\oil\order\Order::where('status', 2);
        if(isset($filter_arr['createtime'])){
            $order_time_arr=explode('/',$filter_arr['createtime']);
            $subsql=$subsql->whereTime('createtime',$order_time_arr);
            //有筛选才有排序
            $sort='total_fee';
            $order='DESC';
        }
        $subsql = $subsql->field('sum(total_fee) as total_fee, user_id as order_user_id')->group('user_id')->buildSql();
        $userTableName=$this->model->getQuery()->getTable();

        $qc=$this->model
            ->join([$subsql => 'w'], $userTableName . '.id = w.order_user_id','left')
            ->where($where);
        if(!empty($dfilter_arr)){
            $qc=$qc->where($dmap);
        }else{
            $qc=$qc->whereOr('user.id', '=', $searchWhere)
                ->whereOr('nickname', 'like', "%$searchWhere%")
                ->whereOr('mobile', 'like', "%$searchWhere%")
                ->whereOr('oil_num', 'like', "%$searchWhere%");
        }
        $total=$qc->order($sort, $order)
            ->count();

        $current_total = 0;     // 当前已循环条数
        $page_size = 2000;
        $total_page = intval(ceil($total / $page_size));
        if ($total == 0) {
            $this->error('导出数据为空');
        }
        for ($i = 0; $i < $total_page; $i++) {
            $page = $i + 1;
            $is_last_page = ($page == $total_page) ? true : false;

            $qs=$this->model
                ->join([$subsql => 'w'], $userTableName . '.id = w.order_user_id','left')
                ->where($where);
            if(!empty($dfilter_arr)){
                $qs=$qs->where($dmap);
            }else{
                $qs=$qs->whereOr('user.id', '=', $searchWhere)
                    ->whereOr('nickname', 'like', "%$searchWhere%")
                    ->whereOr('mobile', 'like', "%$searchWhere%")
                    ->whereOr('oil_num', 'like', "%$searchWhere%");
            }
            $list=$qs->order($sort, $order)
                ->limit($offset, $limit)
                ->select();

            foreach ($list as $item){
                $item['avatar']= cdnurl($item['avatar'],true);
                $item['children_count']= Db::name('user')->where('pid',$item->id)->count();
                $item['parent_oil_num']= Db::name('user')->where('id',$item->pid)->value('oil_num');
                $item['logintime_text']= date("Y-m-d H:i:s",$item['logintime']);
            }

            $list = collection($list)->toArray();
            $current_total += count($list);     // 当前循环总条数
            $export->exportExcel('用户列表-' . date('Y-m-d H:i:s'), $expCellName, $list, $spreadsheet, $sheet, [
                'page' => $page,
                'current_total' => $current_total,
                'is_last_page' => $is_last_page
            ]);
        }
    }

}
